package com.tool;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Iterator;
import java.util.Properties;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

/**
 * 介绍：
 *    Properties工具类
 *************************************************************************************************************************** 
 * 特点：
 *    ①该工具类中的所有方法都是静态方法,从而可直接通过类名调用
 *    ②私有化构造函数,既禁止该类在外部new出实例,也禁止该类被其它外部类继承
 ***************************************************************************************************************************    
 * 作用：
 *    ①读取properties配置文件（按“深度优先”原则遍历目录内的文件,即迭代时无论指定目录内有多少个目录以及目录层次有多深,都会遍历）
 *    ②获取properties配置文件中的信息
 *************************************************************************************************************************** 
 * 涉及技术：
 *    ①查找“类路径（类装载器装载的目录）”内的全部properties文件
 *    ②properties文件的读取
 *    ③安静的关闭IO流
 ***************************************************************************************************************************    
 * 用到的第三方库：
 *    Apache Commons IO（介绍：用于方便IO操作的工具类库）
 *        commons-io-2.4.jar
 */
public class PropertiesTool
{
	
	private static final Properties properties = new Properties();  //用于保存所有“properties配置信息（properties文件中的内容）”的对象
	
	
	private PropertiesTool(){}  //私有化构造函数,既禁止该类在外部new出实例,也禁止该类被其它外部类继承
	
	
	
	/**
	 * 静态代码块,当该类被“类加载器”加载时执行
	 */
	static
	{
		File rootDirectory = new File(PropertiesTool.class.getResource("/").getPath());  //获取当前类装载器装载文件时的根目录
		Iterator<File> iterator = FileUtils.iterateFiles(rootDirectory, new String[]{"properties"}, true);  //创建一个迭代器,用于遍历“指定目录”内的“指定后缀名”的文件,可以按“深度优先”原则遍历,即迭代时无论指定目录内有多少个目录以及目录层次有多深,都会遍历
		while(iterator.hasNext())  //遍历目录（无论指定目录内有多少个目录以及目录层次有多深,都会遍历）
		{
			File file = iterator.next();  //得到目录中的每一个properties文件
			InputStreamReader ipsr = null;
			try
			{
				ipsr = new InputStreamReader(new FileInputStream(file), "utf-8");
				properties.load(ipsr);  //把每一个properties文件的内容都存储到Properties对象中
			}
			catch(IOException e)
			{
				throw new RuntimeException(e);
			}
			finally
			{
				IOUtils.closeQuietly(ipsr);  //关闭流.Apache Commons IO提供了可以安静关闭IO流的函数.此功能主要通过IOUtils类中的closeQuietly方法来完成.closeQuietly方法能够关闭一个或多个Closeable对象（如流、读取器、写入器等）且无需担心null值或IOException异常.这种方法非常有用,因为它可以简化资源管理的代码,特别是在处理多个IO资源时
			}
		}
	}
	
	
	
	
	
	/**
	 * 获取配置信息,根据指定的key获取指定的value
	 */
	public static String get(String key)
	{
		return properties.getProperty(key);
	}
	
	
	
}